package com.hsnn.medstgmini.settlement.service.impl;

import java.util.List;
import java.util.Map;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hsnn.medstgmini.settlement.dao.PaymentDao;
import com.hsnn.medstgmini.settlement.model.SetPayment;
import com.hsnn.medstgmini.settlement.model.form.Payment;
import com.hsnn.medstgmini.settlement.service.PaymentManager;
import com.hsnn.medstgmini.sys.model.SysUser;
import com.hsnn.medstgmini.util.ConstantsUtil;
import com.hsnn.medstgmini.util.Pagination;
import com.hsnn.medstgmini.util.ParseNumber;

/**
 * @category 支付单
 * @author 蔡春龙
 * @date 2015年7月27日
 */
@Service
public class PaymentManagerImpl implements PaymentManager {

	@Autowired
	private PaymentDao paymentDao;

	/**
	 * @category 查询支付单列表
	 * @date 2015年7月27日
	 * @param payment
	 * @param page
	 * @return
	 */
	public Pagination getPaymentList(Payment payment, Pagination page) {
		return paymentDao.getPaymentList(payment, page);
	}
	
	/**
	 * 
	 *@category 获取支付单查看列表数据
	 *@author 邱磊
	 *@date 2015年8月9日 下午3:25:15
	 *@param payment
	 *@param page
	 *@return
	 */
	@SuppressWarnings("unchecked")
	public Pagination getSubmitPaymentList(Pagination page){
		page = paymentDao.getSubmitPaymentList(page);
		List<Map<String, Object>> list = (List<Map<String, Object>>) page.getRows();
		if (null != list && list.size() > 0){
			for (int i = 0; i < list.size(); i++){
				Map<String, Object> map = list.get(i);
				map.put("totalAmount", map.get("totalAmount")==null?"":ParseNumber.toStrDecimal(ParseNumber.toDouble(map.get("totalAmount").toString())));
				map.put("status", map.get("status")==null?"":ConstantsUtil.paymentStatus(map.get("status").toString()));
				
			}
		}
		return page;
	}

	/**
	 * @category 保存支付单
	 * @date 2015年7月27日
	 * @param payment
	 */
	@Transactional
	public void savePayment(SetPayment payment, SysUser user) {
		paymentDao.savePayment(payment, user);
	}

	/**
	 * @category 查询未加入支付单的结算单
	 * @date 2015年7月27日
	 * @param payment
	 * @param page
	 * @return
	 */
	public Pagination getNotAddSettlementList(Payment payment, Pagination page) {
		return paymentDao.getNotAddSettlementList(payment, page);
	}

	/**
	 * @category 查询加入支付单的结算单
	 * @date 2015年7月27日
	 * @param payment
	 * @param page
	 * @return
	 */
	public Pagination getPaymentDetailList(Payment payment, Pagination page) {
		return paymentDao.getPaymentDetailList(payment, page);
	}
	
	@Override
	public Pagination getSetmenDetailList(Pagination page){
		return paymentDao.getSetmenDetailList(page);
	} 
	/**
	 * @category 添加支付明细
	 * @date 2015年7月27日
	 * @param payment
	 */
	@Transactional
	public void addPaymentDetail(List<Payment> paymentList, SysUser user) {
		paymentDao.addPaymentDetail(paymentList, user);
	}

	/**
	 * @category 删除支付单明细
	 * @date 2015年7月27日
	 * @param payment
	 */
	@Transactional
	public void deletePaymentDetail(List<Payment> paymentList, SysUser user) {
		paymentDao.deletePaymentDetail(paymentList, user);
	}

	/**
	 * @category 提交支付单
	 * @date 2015年7月27日
	 * @param payment
	 */
	@Transactional
	public void submitPayment(List<Payment> paymentList, SysUser user) {
		paymentDao.submitPayment(paymentList, user);
	}

	/**
	 * @category 获取根据配送企业分组确认支付列表数据（采购中心,没有卫生局）
	 * @author 邱磊
	 * @date 2015年7月27日 下午7:07:25
	 * @return
	 */
	public Pagination getConfirmPayByCompHospDataList(Pagination page) {
		return paymentDao.getConfirmPayByCompHospDataList(page);
	}

	/**
	 * 
	 * @category 获取根据配送企业分组确认支付列表数据（采购中心,有卫生局）
	 * @author 邱磊
	 * @date 2015年7月27日 下午7:06:12
	 * @return
	 */
	public Pagination getConfirmPayByCompHealDataList(Pagination page) {
		return paymentDao.getConfirmPayByCompHospDataList(page);
	}

	/**
	 * @category 查询支付明细列表
	 * @date 2015年7月27日
	 * @param payment
	 * @param page
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Pagination getSettlementDetailList(Payment payment, Pagination page) {
		page = paymentDao.getSettlementDetailList(payment, page);
		if (null != page){
			List<Map<String, Object>> list = (List<Map<String, Object>>) page.getRows();
			if (null != list && list.size() > 0){
				for (int i = 0; i < list.size(); i++){
					Map<String, Object> map = list.get(i);
					map.put("bankAcctTransType", map.get("bankAcctTransType")==null?"":ConstantsUtil.payType(map.get("bankAcctTransType").toString()));
				}
			}
		}
		return page;
	}
	/**
	 * 
	 *@category 获取支付单查看药品详情
	 *@author 邱磊
	 *@date 2015年8月10日 下午8:58:27
	 *@param payment
	 *@param page
	 *@return
	 */
	@SuppressWarnings("unchecked")
	public Pagination getPaymentPayDetailList(Pagination page) {
		page = paymentDao.getPaymentPayDetailList(page);
		if (null != page){
			List<Map<String, Object>> list = (List<Map<String, Object>>) page.getRows();
			if (null != list && list.size() > 0){
				for (int i = 0; i < list.size(); i++){
					Map<String, Object> map = list.get(i);
					map.put("bankAcctTransType", map.get("bankAcctTransType")==null?"":ConstantsUtil.payType(map.get("bankAcctTransType").toString()));
				}
			}
		}
		return page;
	}
	/**
	 * @category 查询支付明细列表
	 * @date 2015年7月27日
	 * @param payment
	 * @param page
	 * @return
	 */
	public Pagination getAddSettlementDetailList(Payment payment, Pagination page) {
		return paymentDao.getAddSettlementDetailList(payment, page);
	}
	
	/**
	 * 
	 *@category 确认支付操作（采购中心点击“确认支付”按钮）
	 *@author 邱磊
	 *@date 2015年7月28日 下午2:41:11
	 *@param page
	 *@return
	 */
	@Transactional
	public Pagination confirmPay(Pagination page){
		String paymentBillId = page.getConditions().get("paymentBillId");
		SetPayment data = paymentDao.getPaymentById(paymentBillId);
		if (null != data){
			if (6 == data.getStatus()){
				page.setSuccess(false);
				page.setMsg("该支付单已经被支付过，请不要重复支付！");
				return page;
			}
			List<Map<String, Object>> list = paymentDao.getDelPayCount(page);//获取配送企业在当前订单中存不存在没有支付的商品
			if (null != list && list.size() > 0){
				Map<String, Object> map = list.get(0);
				if (1 > ParseNumber.toInteger(map.get("totalOrders").toString())){
					page.setSuccess(false);
					page.setMsg("该配送企业已经被支付过，请不要重复支付！");
					return page;
				}
				List<Map<String, Object>> healPayBalanceList = paymentDao.getHealPayBalance(page);
				if (healPayBalanceList != null && healPayBalanceList.size() > 0){//验证是否有核算中心余额不够支付的
					page.setSuccess(false);
					page.setMsg("有卫生局余额不够支付！");
					return page;
				}
				List<Map<String, Object>> HospPayBalanceList = paymentDao.getHospPayBalance(page);
				if (null != HospPayBalanceList && HospPayBalanceList.size() > 0){//验证是否有医疗机构余额不够支付的
					page.setSuccess(false);
					page.setMsg("有医疗机构余额不够支付！");
					return page;
				}
				paymentDao.confirmPay(page);
				page.setSuccess(true);
				return page;
			} else {
				page.setSuccess(false);
				page.setMsg("支付单异常，请联系管理员！");
				return page;
			}
		} else {
			page.setSuccess(false);
			page.setMsg("支付单异常，请联系管理员！");
			return page;
		}
	}
	/**
	 * @category 根据id查询支付单
	 * @date 2015年7月27日
	 * @param id
	 * @return
	 */
	public SetPayment getPaymentById(String id) {
		return paymentDao.getPaymentById(id);
	}

	/**
	 * @category 删除支付单明细
	 * @date 2015年7月27日
	 * @param payment
	 */
	@Transactional
	public void deletePayment(List<Payment> paymentList, SysUser user) {
		paymentDao.deletePayment(paymentList, user);
	}
	
	/**
	 * @category  更新支付单状态
	 * @author 韩守松
	 * @date   2015年7月29日
	 * @param  @param setPayment
	 * @param  @param user
	 * @param  @return
	 */
	@Transactional
	public boolean updatePaymentStatusById(SetPayment setPayment,SysUser user) {
		boolean flag = false;
		Integer result = paymentDao.updatePaymentStatusById(setPayment, user);
		if(result > 0){
			flag = true;
		}
		return flag;
	}
	
	/**
	 * @category 获取按配送企业分组的支付单数据【含核算中心】
	 * @author 应晓川
	 * @date 2015年7月29日09:20:33
	 * @param 
	 */
	@Override
	public Pagination getCompBySetCenterList(Pagination page) {
		return paymentDao.getCompBySetCenterList(page);
	}

	/**
	 * @category 获取按配核算中心分组的支付单数据【含核算中心】
	 * @author 应晓川
	 * @date 2015年7月29日09:20:33
	 * @param 
	 */
	@Override
	public Pagination getPaymentBySetCenterList(Pagination page) {
		return paymentDao.getPaymentBySetCenterList(page);
	}

	/**
	 * @category 获取按医疗机构分组的支付单数据【含核算中心】
	 * @author 应晓川
	 * @date 2015年7月29日09:20:33
	 * @param 
	 */
	@Override
	public Pagination getPaymentByHospList(Pagination page) {
		return paymentDao.getPaymentByHospList(page);
	}

	/**
	 * @category 获取支付单明细分组的药品数据【含核算中心】
	 * @author 应晓川
	 * @date 2015年7月29日09:20:33
	 * @param 
	 */
	@Override
	public Pagination getSettletdetailinfoByHospList(Pagination page) {
		return paymentDao.getSettletdetailinfoByHospList(page);
	}

	/**
	 * @category 获取按配送企业分组的支付单数据【不含核算中心】
	 * @author 应晓川
	 * @date 2015年7月29日16:49:31
	 * @param 
	 */
	@Override
	public Pagination getPaymentByNoCompList(Pagination page) {
		return paymentDao.getPaymentByNoCompList(page);
	}

	/**
	 * @category 获取医疗机构分组的支付单明细数据【不含核算中心】
	 * @author 应晓川
	 * @date   2015年7月29日17:41:55
	 * @param  
	 */
	@Override
	public Pagination getHospByNoCompList(Pagination page) {
		return paymentDao.getHospByNoCompList(page);
	}
}
